home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / mint / lib / mntlib44.zoo / mntlib / lattice / bcopy.s < prev    next >
Text File  |  1993-10-12  |  2KB  |  99 lines

  1.     INCLUDE    inc.i
  2.     
  3. ; void bcopy(void *src, void *dst, long cnt)
  4. ;    handle overlap (both ways), odd/even alignment etc
  5. ;    ++jrb    bammi@dsrgsun.ces.cwru.edu
  6. ;
  7.     CODE
  8.     IF        _REGARG
  9.     xdef    @bcopy
  10.     xdef    @_bcopy
  11.     ELSE
  12.     xdef    _bcopy
  13.     xdef    __bcopy
  14.     ENDC
  15.     
  16.     IFEQ    _REGARG
  17. _bcopy:
  18. __bcopy:
  19.     move.l    4(sp),a0    ; src -> a0
  20.     move.l    8(sp),a1    ; dst -> a1
  21.     move.l    12(sp),d0    ; cnt -> d0
  22.     ELSE
  23. @bcopy:
  24. @_bcopy:
  25.     tst.l    d0
  26.     ENDC
  27.     ble    return        ; cnt <= 0
  28.     move.l    d2,-(sp)    ; save d2
  29.  
  30.     ; check overlap
  31.     move.l    a0,d1        ; (abs(src - dst)) < cnt =>  overlap
  32.     sub.l    a1,d1
  33.     bge    L1
  34.     neg.l    d1
  35. L1:    cmp.l    d1,d0
  36.     bgt    overlap
  37.  
  38.     ; check for odd src or dst
  39.     move.w    a0,d1
  40.     move.w    a1,d2
  41.     eor.b    d1,d2
  42.     btst    #0,d2
  43.     bne    oddeven
  44.     btst    #0,d1
  45.     beq    eveneven
  46.     move.b    (a0)+,(a1)+    ; odd  odd
  47.     subq.l    #1,d0        ; now even even 
  48.  
  49. eveneven:            ; may want long alignment for 020/030 etc
  50.     move.l    d0,d1
  51.     and.b    #$1c,d1        ; 4 bytes/copy  32 bytes max/iter
  52.     lsr.l    #1,d1        ; calc index into loop (each move.l == 2bytes)
  53.     neg.l    d1        ;  
  54.     add.l    #18,d1        ; 16 + 2 bytes for jmp ext word - d1 == index
  55.     jmp    0(pc,d1)    ;  dive into loop at appro spot
  56. loop1:
  57.     move.l    (a0)+,(a1)+
  58.     move.l    (a0)+,(a1)+
  59.     move.l    (a0)+,(a1)+
  60.     move.l    (a0)+,(a1)+
  61.  
  62.     move.l    (a0)+,(a1)+
  63.     move.l    (a0)+,(a1)+
  64.     move.l    (a0)+,(a1)+
  65.     move.l    (a0)+,(a1)+
  66.  
  67.     sub.l    #32,d0
  68.     bge    loop1
  69.  
  70.     btst    #1,d0
  71.     beq    L4
  72.     move.w    (a0)+,(a1)+    ; residual word
  73. L4:    btst    #0,d0
  74.     beq    ret
  75.     move.b    (a0),(a1)        ; residual byte
  76.  
  77. ret:    move.l    (sp)+,d2
  78. return:    rts
  79.  
  80. oddeven:
  81. upcopy:                ; byte-by-byte forward
  82.     subq.l    #1,d0
  83.     blt    ret
  84.     move.b    (a0)+,(a1)+
  85.     bra    upcopy
  86.  
  87. overlap:
  88.     cmp.l    a0,a1
  89.     bmi    upcopy        ; (src > dst) go do byte/byte forward copy
  90.     add.l    d0,a0        ; otherwise backwards copy
  91.     add.l    d0,a1        ; note we use predec so 1 is not sub from addr
  92.  
  93. downcopy:            ; byte-by-byte backward
  94.     subq.l    #1,d0
  95.     blt    ret
  96.     move.b    -(a0),-(a1)
  97.     bra    downcopy
  98.     end
  99.